(レポート) BDT209: リアルタイムデータ分析および可視化のためのAmazon Elasticsearch Service #reinvent
こんにちは、虎塚です。
re:Invent 2015で「BDT209 - NEW LAUNCH! Amazon Elasticsearch Service for Real-time Data Analytics and Visualization(日本語タイトル: リアルタイムデータ分析および可視化のためのAmazon Elasticsearch Service)」を聴講したのでレポートします。発表されたのは、Jon HandlerさんとPravin Pillaiさんで、いずれもAWSの方でした。
Amazon Elasticsearch Serviceは先日リリースされたばかりの新サービスです。
このセッションで扱うこと
- 前提となるコンテキスト: 増大するデータを管理する
- Amazon Elasticsearch Service (Amazon ES)の紹介
- Amazon ESを利用する際の設定、セキュリティ強化、接続、モニタリング、スケーリングについて
Amazon Elasticsearch Service(以下、Amazon ES)は、クラスタのデプロイ、管理、スケールが簡単にできるサービスです。
背景: システムで扱うデータの増大
クラウドコンピューティングでは、データは増加し続けています。データを集めることは簡単になり、昔よりも安価に保存できるようになりました。
たとえば、プロダクトのデータ、システムのログデータ、顧客との会話(CSR)、マーケティングデータなどが増大して、テラバイト単位の量になることもあります。
これらの大量データに対してなにができるでしょうか。
ハーバード大学のGary King先生の「Big data is not about the data」という言葉があります。データが巨大になり、集めることが簡単になりましたが、本当の価値は分析の中にある、という意味です。
- 情報を共有する
- 洞察を引き出す
- パターンを理解する
- パフォーマンスを追跡する
などの用途がありますが、最終的に、ビジネス、技術、オペレーション上の意思決定が必要です。
シナリオ1: 全文検索
まず、ナレッジ共有システムでの全文検索について考えてみましょう。
- チームは継続的にコンテンツを生み出しています
- あなたはそれらのナレッジベースを検索しやすく、アクセスしやすくすることを担当しています
- テキストマッチングを含むキー検索、ファセット検索、フィルタリング、ファジー検索、オートコンプリート、ハイライトなどの機能が必要です
シナリオ2: ストリーミングデータ分析
次に、侵入検知について考えてみます。ここでは、高速に生成されるデータを、高速に分析するタスクが重要です。
- システムを攻撃から守らなければなりません
- ほぼリアルタイムにセキュリティイシューを検知するためには、簡単に扱えてパワフルな分析と可視化のツールが必要です
- 様々なキーデータソースから情報をキャプチャするには、簡単かつ柔軟にデータを取り込めることが重要です
シナリオ3: バッチデータ
最後に、ユーザの利用方法をモニタリングすることについて考えてみます。ユーザが生成する膨大なデータを扱います。
- あなたはモバイルアプリの開発者です
- アプリの複数バージョンにわたるユーザの操作を監視/管理しなければなりません
- アプリの使用方法とバージョン間の移行について分析し、レポートしたくなるでしょう
オプションのツール群
これらのシナリオに取り組むにあたり、採用可能なオプションのツールとして、Cassandra、Hive、Hadoop、Mahout、MongoDB、Spark、Solr、そしてElasticsearchなどがあります。有名なオープンソーステクノジーがたくさんあります。
Elasticsearchは何をしてくれるツールか
Elasticsearchは、パワフルでリアルタイム性のあるオープンソースの分散検索/分析エンジンです。大規模なデータを検索できます。
- Apache Luceneの上に作られています
- スキーマフリー
- 開発者にやさしいRESTfulなAPIがあります
また、LogstashやKibanaといったリアルタイム分析とデータ可視化を提供する周辺ツールがあり、これらはELK stackと呼ばれています。
しかしながら、Elasticsearchの運用には手間がかかるのが問題でした。
そこで、Amazon ESが発表されました。このサービスを使えば、Elasticsearchクラスタのデプロイ、運用、スケールが、AWS上で簡単に操作できます。
Amazon ESの特長
- クラスタの作成や管理設定が簡単で、すぐにはじめられます
- ELKをサポートしています
- セキュリティ対応
- AWS IAMでクラスタへのアクセス制御ができます
- CloudWatchでメトリックスを取得して監視できます
- CloudTrailとも統合されているので監査に対応できます
- CloudWatch Logs、DynamoDB、S3、KinesisなどのAWSサービスともつなぐことができます
デモ
クラスタ作成画面の解説
インスタンスタイプと個数、ストレージタイプなどを選ぶだけで、非常に簡単にクラスタを作成できます。
まず、データノードとマスターノードの設定をします。次に、ストレージの種別や容量を指定します。ストレージにはインデックスなどが格納されます。
また、オプションとして、チェックボックスにチェックするだけで、2つのAvailabilityZoneにクラスタが自動的に分散配置されます。
AWS CLIコマンド
ドメインの作成/削除、タグの追加/削除など、ごくシンプルなコマンドが用意されています。たとえば、ドメインに名前をつけて作成するesコマンドは、次のようになります。
aws es create-elasticsearch-domain --domain-name my-domain \ --elasticsearch-cluster-config \ InstanceType=m3.xlarge.elasticsearch,InstanceCount=3 \ --ebs-options \ EBSEnabled=true,VolumeType=gp2,VolumeSize=512
Amazon ES ドメインの概観
- (図右下のサーバ群) マスターノード管理下のデータノード上で、ElasticsearchやKibanaが動きます
- (外部からのアクセスを受けるELB) REST APIのシングルエンドポイントです。Elasticsearch APIを介してElasticsearchへHTTPで接続できます
- (IAM) クラスタへのアクセス制御をおこないます
- ドメインレベル、インデックスレベルなどできめ細かく、ユーザ単位で権限を設定できます
- (CloudWatchとCloudTrail) クラスタをモニタリングします
なお、負荷がかかったときのスケーリングの設定変更は、サービスを停止することなくオンラインで実行できます。
データパーティショニング
ドメイン内のインデックスの様子が、次の図に描かれています。各シャードがドキュメントを保持します。
- Document: 検索の単位
- ID: 一意のID(ドキュメントごとに1つ採番される)
- Field: DocumentはFieldの集合で構成される
- Shard: Luceneのインスタンス(インデックスの一部分を担う)
- Index: データの集合
クラスタへのインデックスのデプロイ
スライドを参照ください(黄色の四角形がノードです。3個のノードで1個のクラスタを構成しています)。
プライマリの各Shardが、それぞれ別々のインスタンスに配置され、冗長性が確保されます。
インスタンスタイプの推奨設定
インスタンス | 用途 |
---|---|
T2 | 最初はこれで。開発とテスト用。dedicated masterにも利用できる |
M3 | 読み出しと書き込みが大体同じくらいの用途に向く。5TBまでのEBSを利用できる |
R3 | メモリ最適化インスタンスなので、読み込みが多いかクエリ発行が多い用途に向く(Kibanaを使うならこちらを推奨) |
I2 | バックエンドが高速。16TBまでのSSDインスタンスストレージが利用できる |
ドメインへセキュアにアクセスする
セキュリティポリシーに応じて、IAMポリシーでアクセス制御をおこないます。例を次に示します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam:123456789012:user/user-name" }, "Action": [ "es:ESHttpGet", "es:ESHttpPut", "es:ESHttpPost", "es:CreateElastisearchDomain", "es:ListDomainNames" ], "Resource": "arn:aws:es:us-east-1:###:domain/logs-domain/<index>/*", "Condition": "IpAddress": { "aws:SourceIp": [ "xx.xx.xx.xx/yy" ] } } ] }
どのユーザがアクセスできるか、何に対してアクセスできるかを、ユーザベースポリシーで設定します。アクセス制御は、ドメインレベル、インデックスレベルで可能です。上記ではインデックスレベルのアクセス制御をしています(arnで指定しています)。
また、Condition要素を記述して、IPアドレスベースのアクセス制御も可能です。IPアドレスをレンジで記述することもできます。
Elasticsearch APIへの直接アクセスの例
curlを使ってエンドポイントに対してHTTPリクエストを発行するコマンド例が紹介されました(省略)。
Amazon ESへのデータ読み込み
Logstashを使ったデータ読み込み
Logstashを使用して、Amazon ESのドメインへデータをpushできます。
- Amazon ESのLogstash pugin: awslabs/logstash-output-amazon_es
AWS Lambdaを使ったデータ読み込み
S3、DynamoDB、KinesisなどからAWS Lambdaへデータを送って、Amazon ESへデータをアップロードできます。
CloudWatch LogsからESにログを出力するデモ
CloudWatch Logsで収集したログデータに対して、Elasticsearchのパワフルな検索を利用してみましょう。また、Kibanaを使った可視化も試してみましょう。
- EC2の上でJMeterを動かして、CloudWatch LogsにJMeterの動作ログを出力します
- CloudWatch LogsのActionメニューから、Amazon ESを選択してデータを送り込みます
- Elasticsearch Serviceに入ったデータをKibanaで可視化します
運用、管理
監視と監査
CloudWatchで監視に、CloudTrailで監査に対応します。CloudWatchでは17個のメトリックスにアクセスできます。その中で、特に監視したほうがよい項目は次のとおりです。
- FreeStorageSpace
- クラスタが空領域を使い切る前にアラームを上げます
- CPUUtilization
- 80%のCPU使用率になったら、スケールアップやインスタンスのサイズ増強をおこなうべきです
- ClustrerStatus.yellow
- レプリケーションが追加ノードを必要とするかどうかをチェックします
- JVMMemoryPressure
- インスタンスタイプと数が十分かをチェックします
- MasterCPUUtilization
- マスターノードの監視はデータノードと分離しておこなわれます
スナップショットとリストア
日次で自動スナップショットを取るように設定できます。また、手動でスナップショットを取ることもできます。作成されたスナップショットは、S3バケットに保存されます。
CLIから手動でスナップショットを取る際は、IAMでアクセス制御をおこなってください。S3バケットにもポリシーの設定が必要なことに注意します。
ビルトインのKibana
自分でKibanaを導入して運用する必要はなく、ビルトインのKibanaを利用できます。そのため、Logstash -> Amazon ES -> Kibanaという流れが簡単に実現できます。
収集したデータをKibanaで可視化、分析して、ビジネスに活用しましょう。
なお、Kibanaのセキュリティを確保するには、オプションでプロキシサーバを手前に置き、Amazon ESのアクセス制御でIPアドレスベースのIAMポリシーを適用する方法があります。
従量課金
Amazon ESでは、使用したコンピューティングとストレージのサイズに対して課金されます。
Amazon ESは日本リージョンですでに利用可能です。
まとめ
- Elasticsearchは全文検索、分析、時系列データ可視化のためのツールで、増大するデータセットを扱うビジネスに有用です
- Amazon ESでは、elasticsearchクラスタのデプロイや管理が簡単になります
- Amazon ESは、既存のElasticsearchクラスタを置き換えることができます
おわりに
レポートで上手くお伝えできないのが残念ですが、デモがとても良かったです(セッション動画が公開されたら、この記事からもリンクします)。そのままでは見づらいCloudWatch Logsのログが、Amazon ESに取り込まれて検索可能になり、さらにKibanaで可視化された様子には感激しました。これが欲しかったんです! ほかのサービスとの連携で、さまざまな使い方が生まれそうですね。これからどんどん使っていきます。
それでは、また。